/**
 * $version:  0.1 
 * $Date: 2011-01-21 
 *
 * Copyright (C) 2010-2011 Jinrui Software. All rights reserved.
 *
 */

package org.jawa.admin.util;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.jawa.core.log.Log;

/**
 * 用于JSP页面的参数获取。
 */
public class ParamUtils {

	/**
	 * 返回一个字符串参数。
	 * 
	 * @param request
	 *            HttpServletRequest 请求对象
	 * @param name
	 *            参数名称
	 * @return 参数值
	 */
	public static String getParameter(HttpServletRequest request, String name) {
		return getParameter(request, name, false);
	}

	/**
	 * 返回一个字符串参数。
	 * 
	 * @param request
	 *            HttpServletRequest 请求对象。
	 * @param name
	 *            参数名称
	 * @param emptyStringsOK
	 *            对于空字符串，返回空串还是 null。
	 */
	public static String getParameter(HttpServletRequest request, String name, boolean emptyStringsOK) {
		String temp = request.getParameter(name);
		if (temp != null) {
			if (temp.equals("") && !emptyStringsOK) {
				return null;
			} else {
				return temp;
			}
		} else {
			return null;
		}
	}

	/**
	 * 返回请求中的所有的参数名称。
	 * 
	 * @param request
	 *            HttpServletRequest 请求。
	 * @param name
	 *            参数名称
	 * @return 如果没有找到返回一个长度为0的数组。
	 */
	public static String[] getParameters(HttpServletRequest request, String name) {
		if (name == null) {
			return new String[0];
		}
		String[] paramValues = request.getParameterValues(name);
		if (paramValues == null || paramValues.length == 0) {
			return new String[0];
		} else {
			java.util.List values = new java.util.ArrayList(paramValues.length);
			for (int i = 0; i < paramValues.length; i++) {
				if (paramValues[i] != null && !"".equals(paramValues[i])) {
					values.add(paramValues[i]);
				}
			}
			return (String[]) values.toArray(new String[] {});
		}
	}

	/**
	 * 返回一个布尔型的参数.
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 参数值
	 */
	public static boolean getBooleanParameter(HttpServletRequest request, String name) {
		return getBooleanParameter(request, name, false);
	}

	/**
	 * 返回一个布尔型的参数.
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 参数值
	 */
	public static boolean getBooleanParameter(HttpServletRequest request, String name, boolean defaultVal) {
		String temp = request.getParameter(name);
		if ("true".equals(temp) || "on".equals(temp)) {
			return true;
		} else if ("false".equals(temp) || "off".equals(temp)) {
			return false;
		} else {
			return defaultVal;
		}
	}

	/**
	 * 返回一个整型的参数.
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 参数值
	 */
	public static int getIntParameter(HttpServletRequest request, String name, int defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			int num = defaultNum;
			try {
				num = Integer.parseInt(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 *返回一个整型的参数数组.
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @param defaultNum
	 *            默认值
	 */
	public static int[] getIntParameters(HttpServletRequest request, String name, int defaultNum) {
		String[] paramValues = request.getParameterValues(name);
		if (paramValues == null || paramValues.length == 0) {
			return new int[0];
		}
		int[] values = new int[paramValues.length];
		for (int i = 0; i < paramValues.length; i++) {
			try {
				values[i] = Integer.parseInt(paramValues[i]);
			} catch (Exception e) {
				values[i] = defaultNum;
			}
		}
		return values;
	}

	/**
	 * 返回一个双精型的参数值.
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @param defaultNum
	 *            默认值
	 * @return 参数值
	 */
	public static double getDoubleParameter(HttpServletRequest request, String name, double defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			double num = defaultNum;
			try {
				num = Double.parseDouble(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * 返回一个长整型的参数值
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @param defaultNum
	 *            默认值
	 * @return 参数值
	 */
	public static Long getLongParameter(HttpServletRequest request, String name, long defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			long num = defaultNum;
			try {
				num = Long.parseLong(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * 返回一个长整型的参数数组
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @param defaultNum
	 *            默认值
	 * @return 参数值
	 */
	public static long[] getLongParameters(HttpServletRequest request, String name, long defaultNum) {
		String[] paramValues = request.getParameterValues(name);
		if (paramValues == null || paramValues.length == 0) {
			return new long[0];
		}
		long[] values = new long[paramValues.length];
		for (int i = 0; i < paramValues.length; i++) {
			try {
				values[i] = Long.parseLong(paramValues[i]);
			} catch (Exception e) {
				values[i] = defaultNum;
			}
		}
		return values;
	}

	/**
	 * 返回一个字符串属性
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 属性值
	 */
	public static String getAttribute(HttpServletRequest request, String name) {
		return getAttribute(request, name, false);
	}

	/**
	 * 返回一个字符串的属性值
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @param emptyStringsOK
	 *            对于空字符串，返回空串还是 null。
	 * @return 属性值
	 */
	public static String getAttribute(HttpServletRequest request, String name, boolean emptyStringsOK) {
		String temp = (String) request.getAttribute(name);
		if (temp != null) {
			if (temp.equals("") && !emptyStringsOK) {
				return null;
			} else {
				return temp;
			}
		} else {
			return null;
		}
	}

	/**
	 * 返回一个布尔型的属性值
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 属性值
	 */
	public static boolean getBooleanAttribute(HttpServletRequest request, String name) {
		String temp = (String) request.getAttribute(name);
		if (temp != null && temp.equals("true")) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 返回一个整型的属性值
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 属性值
	 */
	public static int getIntAttribute(HttpServletRequest request, String name, int defaultNum) {
		String temp = (String) request.getAttribute(name);
		if (temp != null && !temp.equals("")) {
			int num = defaultNum;
			try {
				num = Integer.parseInt(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * 返回一个长整型的属性值
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 * @param name
	 *            参数名称
	 * @return 属性值
	 */
	public static long getLongAttribute(HttpServletRequest request, String name, long defaultNum) {
		String temp = (String) request.getAttribute(name);
		if (temp != null && !temp.equals("")) {
			long num = defaultNum;
			try {
				num = Long.parseLong(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * 将request中的值填充到bean中.Map中的Key值为bean中的属性名称.类型转换自动进行.
	 * 
	 * @param formBean 对象
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	 */
	public static void populateBean(Object formBean, HttpServletRequest request) {
		populateBean(formBean, request.getParameterMap());
	}

	/** 
	 * 将MAP中的值填充到bean中.Map中的Key值为bean中的属性名称.类型转换自动进行.
	 * 
	 * @param formBean 对象
	 * 
	 * @param request
	 *            HttpServletRequest 请求
	*/
	public static void populateBean(Object bean, Map propertyMap) {
		try {
			BeanUtils.populate(bean, propertyMap);
		} catch (Exception e) {
			Log.error("从请求中获取数据转换为对象时出错", e);
		}
	}

}